--Observer Pattern
--[[
    观察者模式：（行为型）
    作用：模块解耦
    使用场景：实现响应式属性（将 model层 与 view层 绑定）
--]]

require 'Class'

Event = Class()
Event.observers = {}
Event.Subscribe = function(self,callback)  --事件注册
    self.observers[#self.observers+1] = callback
end
Event.Notify = function(self,...)  --事件广播
    for k,v in pairs(self.observers) do
        v(...)
    end
end

ReactiveProperty = Class()  --响应式属性
ReactiveProperty.value = nil
ReactiveProperty.onValueChanged = Event:New()  --callback的参数：oldValue , newValue
ReactiveProperty.SetValue = function(self,newValue)
    if self.value == newValue then return end
    local oldValue = self.value
    self.value = newValue
    self.onValueChanged:Notify(oldValue,newValue)
end

--------Main--------
function main()
    local playerLv = ReactiveProperty:New()  --响应式属性
    playerLv.value = 1
	--第一处注册响应式属性：
    local callback = function(oldValue,newValue)
        print(string.format('玩家由%d级提升到%d级.',oldValue,newValue))
    end
	playerLv.onValueChanged:Subscribe(callback)
	--第二处注册响应式属性：
	playerLv.onValueChanged:Subscribe(
	function(oldValue,newValue)
		print(string.format('通知服务器，玩家由%d级提升到%d级.',oldValue,newValue))
	end)

	--属性变化，执行回调
    playerLv:SetValue(2)  --玩家由1级提升到2级.
						  --通知服务器，玩家由1级提升到2级.
end

main()
